import { TaskType, SDKConfig, ApiResult, OcrLlmResult, OcrResult } from "./types";
import { ApiClient } from "./client";

export default class OcrLlmApi extends ApiClient {
  private _endpoint: string;
  private _type: typeof TaskType[keyof typeof TaskType];
  private _scenario: string;

  constructor(options: SDKConfig) {
    super(options);

    this._type = options.type || TaskType.OCR;
    this._endpoint = this._type === TaskType.OCR ? '/ocr' : '/ocr/llm';
    this._scenario = options.scenario || "material_label";

    this.setRequestInterceptor(async (input, init) => [input, init]);

    this.setResponseInterceptor(async (response) => {
      // 如果接口返回非200，直接在这里统一处理
      if (response.code !== 200) {
        this.logger.warn(`Response code: ${response.code}`)
        // 保留原始响应给调用方
        throw {
          code: response.code,
          msg: response.msg,
          data: response.data
        };
      }
      this.logger.debug(`Response code: ${response.code}`)
      return response;
    });
  }

  /**
   * 创建任务（统一 POST 请求封装）
   */
  private postTask<T>(path: string, body: any) {
    return this.clientPost<ApiResult<T>>(`${this._endpoint}${path}?scenario=${this._scenario}`, body);
  }

  /**
   * 上传任务（统一文件上传封装）
   */
  private uploadTask<T>(path: string, file: File, prompt: string = "") {
    return this.clientUpload<ApiResult<T>>(`${this._endpoint}${path}?scenario=${this._scenario}`, file, prompt);
  }

  /**
   * 通过网络图片地址创建任务
   */
  createTaskByUrl(image_url: string, prompt: string = "") {
    return this.postTask<{ task_id: string }>("/url-task", { image_url, prompt });
  }

  /**
   * 通过 base64 图片创建任务
   */
  createTaskByBase64(img_base64: string, prompt: string = "") {
    // 如果后端固定字段名为 img_base64，则保留；否则可统一为 image_base64
    return this.postTask<{ task_id: string }>("/base64-task", { img_base64, prompt });
  }

  /**
   * 通过文件上传创建任务
   */
  createTaskByBinary(file: File, prompt: string = "") {
    return this.uploadTask<{ task_id: string }>("/binary-task", file, prompt);
  }

  /**
 * 通过网络图片地址创建任务
 */
  createByUrl(image_url: string, prompt: string = "") {
    return this.postTask<ApiResult<OcrLlmResult | OcrResult>>("/url", { image_url, prompt });
  }

  /**
   * 通过 base64 图片创建任务
   */
  createByBase64(image_base64: string, prompt: string = "") {
    // 如果后端固定字段名为 img_base64，则保留；否则可统一为 image_base64
    return this.postTask<ApiResult<OcrLlmResult | OcrResult>>("/base64", { image_base64, prompt });
  }

  /**
   * 通过文件上传创建任务
   */
  createByBinary(file: File, prompt: string = "") {
    return this.uploadTask<ApiResult<OcrLlmResult | OcrResult>>("/binary", file, prompt);
  }

  /**
   * 获取任务结果
   */
  getTaskResult(taskId: string) {
    return this.clientGet<ApiResult<OcrLlmResult | OcrResult>>(`${this._endpoint}/task/${taskId}`);
  }
}
